/**
 * @file Mode.hpp
 *
 * @date 15/12/2011
 * @author Tales 
 *
 */

#ifndef _VIEW_MODE_HPP_
#define _VIEW_MODE_HPP_

#include <SDL.h>

namespace yep
{

class Editor;
// Forward

/**
 * @brief Apenas uma implementação jurássica de UI. É muito tosca, mas serve pra testar.
 *
 * É uma classe abstrata, pois cada modo é uma implementação desta.
 */
class Mode
{
public:
	/**
	 * @brief Destrutor
	 */
	virtual ~Mode();

	/**
	 * @brief Chamado para tratar um SDL_Event.
	 * @param editor O editor atual;
	 * @param event O evento lançado.
	 */
	virtual void handle(Editor &editor, const SDL_Event &event) = 0;

	/**
	 * @brief Executa uma função lógica.
	 *
	 * Executado uma vez por frame, assim que a fila de eventos é esvaziada (e tratada por Mode.handle()).
	 * @param editor O editor atual.
	 */
	virtual void logic(Editor &editor) = 0;

	/**
	 * @brief Desenha o modo atual na tela.
	 * @param editor o editor atual;
	 * @param surface a superfície na qual desenhar.
	 */
	virtual void draw(Editor &editor, SDL_Surface *surface) = 0;

	/**
	 * @brief Obtém o Mode atual.
	 * @return um Mode.
	 */
	static Mode &getCurrentMode();
	/**
	 * Altera o Mode atual.
	 * @param currentMode o novo mode.
	 */
	static void setCurrentMode(Mode & newMode);
private:
	static Mode *currentMode;
};

} /* namespace yep */
#endif /* _VIEW_MODE_HPP_ */
